//
// Created by ct on 2020/11/30.
//
#include "url_parse.h"
#include <queue>
namespace url_parse{

    void parse_url(const std::string&  url){
        std::cout<<url<<std::endl;
    };

    // string str = "/link?param1=1&param2=2&param3=3";
    url_result_map parse(const std::string& url){
        // 存储临时str
        std::string tmp_path;
        // 临时存储解析的数据,长度不大于3
        std::queue<size_t> que;
        // 存储解析的数据
        url_result_map urp;
        auto index = url.find('?');
        if(index == std::string::npos){
            urp["router"] = url.substr(0, url.size());
            return urp;
        }

        // 保存路由
        urp["router"] = url.substr(0, index);

        // 为了索引方便，添加结束符&
        tmp_path = url.substr(index) + '&';
        for (size_t i = 0; i < tmp_path.size(); i++) {
            // 遇见 ？ & = 都要做标记，保存记录到queue，每两个标志位中间间隔一个解析值
            if (tmp_path[i] == '?' || tmp_path[i] == '&' || tmp_path[i] == '=') {
                que.push(i);
            }
            // 需要推出两个，保留第三个需要复用
            if (que.size() == 3) {
                size_t one = que.front();
                que.pop();
                size_t tow = que.front();
                que.pop();
                size_t three = que.front();
                // 解区字符串是，从哪里截取，截取多少
                urp[tmp_path.substr(one + 1, tow - one - 1)] = tmp_path.substr(tow + 1, three - tow - 1);
            }
        }
        return urp;
    }
}